#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<string.h>
#include<cassert>
using namespace std;

// void sigcb(int signalnum)
// {
//     //打印信号
//     //cout<<"signal:"<<signalnum<<endl; 
    


// }

// int main()
// {
//      //signal(SIGINT,sigcb);   //信号处理的替换


//     //  while(true)
//     // {
//     //     cout<<"进程pid->["<<getpid()<<"]"<<endl;
//     //     sleep(1);
//     // }
//     // return 0;
// }


// void sigcb(const sigset_t &pending)
// {
//     cout<<"pending位图:";
//     for(int signum=1;signum<=31;signum++)
//     {
//         if(sigismember(&pending,signum)) //判断signum是否在pending中
//         {
//             cout<<"1";
//         }
//         else
//         {
//             cout<<"0";
//         }
//     }
//     cout<<"\n";

// }

// void handler(int signum)
// {
//     cout<<signum<<"号信号的捕捉"<<endl;
//     int sec=30;

//     while(--sec)
//     {
//         sigset_t pending;  //信号量的类型
//         sigemptyset(&pending);  //清空信号二进制
//         sigpending(&pending);//读取当前进程的未决信号集
//         sigcb(pending);
//         sleep(1);



//     }


// }


// int main()
// {
   
//     struct sigaction act,oldact;
//     memset(&act,0,sizeof(act));
//     memset(&oldact,0,sizeof(oldact));
//     //初始化
//     act.sa_handler=handler;   //这个结构体里的方法进行初始化
//     act.sa_flags=0;         //把信号都初始化为0

//     sigemptyset(&act.sa_mask); //清空信号

//     sigaddset(&act.sa_mask,SIGINT); //注册信号

//     sigaction(2,&act,&oldact);  //捕获信号

//     while(true)
//     {
//         cout<<"进程pid->["<<getpid()<<"]"<<endl;
//         sleep(1);
//     }

//     return 0;
// }



void sigcb(const sigset_t &pending)
{
    cout<<"pending位图:";
    for(int signum=1;signum<=64;signum++)
    {
        if(sigismember(&pending,signum)) //判断signum是否在pending中
        {
            cout<<"1";
        }
        else
        {
            cout<<"0";
        }
    }
    cout<<"\n";

}

void handler(int signum)
{
    cout<<signum<<"号信号的捕捉"<<endl;
    int sec=30;

    while(--sec)
    {
        sigset_t pending;  //信号量的类型
        sigemptyset(&pending);  //清空信号二进制
        sigpending(&pending);//读取当前进程的未决信号集
        sigcb(pending);
        sleep(1);



    }

}

//触发
void GetSIGRTMIN()
{
     //获取SIGRTMIN + 6
    int sig=SIGRTMIN+6;
    int n=kill(getpid(),sig);
    assert(n!=-1);
    
}
void GetSIGINT()
{
    int sig=SIGINT;
    int n=kill(getpid(),sig);
    assert(n!=-1);
}



int main()
{
    //自定义捕捉
    signal(SIGINT,handler);
    
    
    signal(SIGRTMIN+6,handler);



    int sec=0;
    int count=0;
    //屏蔽信号
    sigset_t set,oset;
    //初始化
    sigemptyset(&set);
    sigemptyset(&oset);
    //注册信号
    sigaddset(&set,SIGINT);
    sigaddset(&set,SIGRTMIN+6);


    


    //信号屏蔽设置进程
    sigprocmask(SIG_BLOCK,&set,&oset);

    //获取pending信号集合，打印

    while(true)
    {
        //获取pending信号集
        sigset_t pending;
        sigemptyset(&pending);
        int n=sigpending(&pending);  
        //读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1
        assert(n==0);
        (void)n;

        //信号发送
        if(count++<=5)
        {
            GetSIGRTMIN();
            GetSIGINT();
        }
            
        

        //打印
        sigcb(pending);

        //
        sleep(1);

        //20s后对所有信号的block动作
        if(sec++==20)
        {
            cout<<"解除信号屏蔽"<<endl;
            sigprocmask(SIG_SETMASK,&oset,nullptr);//恢复旧的信号
        }
    }

    





    return 0;
}


